// Grunt 的入口文件
// 用于定义一些需要Grunt自动执行的任务

// 需要导出一个函数
// 此函数接受一个grunt的形参，内部提供一些创建任务时可以用到的API

const sass = require('sass')
const loadGruntTasks = require('load-grunt-tasks')

module.exports = grunt => {
  grunt.loadNpmTasks('grunt-contrib-clean')
  loadGruntTasks(grunt) // 自动加载所有的grunt插件中的任务
  // grunt.loadNpmTasks('grunt-sass')
  // grunt.loadNpmTasks('grunt-sass')
  grunt.initConfig({
    // foo: {
    //   bar: 123
    // },
    clean: { // grunt-contrib-clean多目标任务，需要配置initconfig
      // temp: 'temp/app.js',
      temp: 'temp/**',
    },
    build: {
      options: { // 作为任务的配置选项出现，并不会被执行;可以通过this.options拿到配置选项
        foo: 'bar'
      }, 
      css: {
        options: {
          foo: 'baz'
        }
      },
      js: '2'
    },
    sass: {
      options: {
        sourceMap: true,
        implementation: sass
      },
      main: {
        files: {
          'dist/css/main.css': 'src/scss/main.scss'
        }
      }
    },
    babel: {
      options: {
        sourceMap: true,
        presets: ['@babel/preset-env']
      },
      main: {
        files: {
          'dist/js/index.js': 'src/js/index.js'
        }
      }
    },
    watch: {
      js: {
        files: ['src/js/*.js'],
        tasks: ['babel']
      },
      css: {
        files: ['src/scss/*.scss'],
        tasks: ['sass']
      }
    }
  })
  grunt.registerTask('default', ['sass', 'babel', 'watch'])

  // grunt.registerTask('foo', () => {
  //   console.log(grunt.config('foo.bar'));
  //   // console.log('hello grunt~');
  // })

  // grunt.registerTask('bar', '任务描述', () => {
  //   console.log('other task~');
  // })

  // grunt.registerTask('default', () => {
  //   console.log('default task ~');
  // })
  // 默认任务，可以处理一些默认的操作
  // grunt.registerTask('default', ['foo', 'bad', 'bar'])

  // grunt默认支持同步模式，不支持异步操作
  // 如果需要异步操作，那就必须使用this的async方法 得到一个回调函数，通过调用这个回调函数标识这个任务被完成
  // grunt.registerTask('async-task', () => {
  //   setTimeout(() => {
  //     console.log('async task working~');
  //   }, 1000);
  // })
  // grunt.registerTask('async-task', function() {
  //   const done = this.async()
  //   setTimeout(() => {
  //     console.log('async task working~');
  //     done()
  //   }, 1000);
  // })

  // 标记任务失败
  // 当在调用任务时，一旦有任务失败那么后面的任务将不会被执行
  // 如果需要执行，我们在命令上可以使用 --force来进行强制继续执行
  // yarn grunt default --force
  // grunt.registerTask('bad', () => {
  //   console.log('bad working');
  //   return false
  // })
  // // 如果是异步任务时，我们并不能通过return false 来标记任务失败了
  // // 那么此时，只需要将异步回调函数绑定一个false的实参就可以
  // grunt.registerTask('bad-async', function() {
  //   const done = this.async()
  //   setTimeout(() => {
  //     console.log('bad async');
  //     done(false)
  //   }, 1000);
  // })

  // 多目标魔术，可以让任务根据配置形成多个子任务
  // 需要对多目标配置不同的目标 ，通过initConfig进行配置
  // grunt.registerMultiTask('build', function() {
  //   // console.log('build task');
  //   console.log(this.options()); // 可以通过this.options拿到配置选项
  //   console.log(`target: ${this.target}, data: ${this.data}`);
  // })
}